package d2_final_exam.d2_second_question;

import java.util.*;
import java.util.stream.Collectors;

/**
 * **需求**
 * * 某个班级组织团建活动，班长给出了几个去处给大家选择，分别是 “农家乐” , "轰趴"，“野外拓展”，“健身房”，本次活动每个学生是可以多选的。
 * * 现在有如下5名学生选择了如下去处。
 * 张全蛋儿  农家乐,野外拓展
 * 李二狗子  轰趴,野外拓展,健身房
 * 翠花     野外拓展，
 * 小帅     轰趴，健身房
 * 有容     农家乐
 * **具体的功能点如下：**
 * 1、请找出每个去处想去的人数是多少，并输出投票最多的去处是哪个。
 * 2、请找出哪些人没有选择投票最多的去处，输出他们的名字。（**本案例用不用stream流做都给分**）
 */
public class Demo01 {
    //2、创建一个随机数对象, 由于很多地方需要使用
    private static Random r = new Random();

    public static void main(String[] args) {
        //目标: 实现选团建景点的需求

        //5、创建一个数组,用于存储每一个学生
        String[] studentsName = {"张全蛋儿", "李二狗子", "翠花", "小帅", "有容"};
        //1、首先定义一个数组存储所有的景点
        String[] scenicSpot = {"农家乐", "轰趴", "野外拓展", "健身房"};

        //3、思路就是,学生随机选取一个景点,随机选取多少个景点---->使用面向对象的思想做,定义一个选景点的类,用于存储学生与学生选取的景点数
        //首先创建一个集合,用于存储学生对象-->而学生对象里面封装了-->学生名字与景点数
        List<Student> students = new ArrayList<>();

        //4、开始初始初始化学生的景点
        for (String name : studentsName) {
            //6、创建对象开始封装数据
            Student student = new Student();
            //8、首先对名字进行封装
            student.setName(name);
            //7、随机生成一个学生选取的景点数
            int number = r.nextInt(scenicSpot.length) + 1;
            //13、首先要创建一个集合给对象
            student.setScenicSpot(new HashSet<>());
            //9、开始循环选取景点
            while (student.getScenicSpot().size() < number) {//集合大小是三的时候,就会进去,进去之后,出来就是4
                //10、再次开始生成一个随机数,代表要选取的景点
                int numberSpot = r.nextInt(scenicSpot.length);
                //12、按照官方
                String s = scenicSpot[numberSpot];
                //11、存储当前学生的集合中
                student.getScenicSpot().add(s);
            }
           /*
            for (int i = 0; i < number; i++) {

            }*/
            //14、最后将对象存到集合中去
            students.add(student);
        }
//        students.forEach(s -> System.out.println(s));
        students.forEach(System.out::println);
        System.out.println("----------------------------------------------");
        //16、首先定义一个Map集合 用于景点与景点的次数
        Map<String, Integer> infos = new HashMap<>();
        //17、遍历集合
        for (Student student : students) {
            //1.获取每一个对象的集合--->并进行遍历
            for (String spots : student.getScenicSpot()) {
                //2.开始存到集合中去
                infos.put(spots, infos.containsKey(spots) ? infos.get(spots) + 1 : 1);
            }
        }

        infos.forEach((k, v) -> System.out.println(k + "=" + v));
        System.out.println("--------------------------------------------------------------------------------");
        /**
         * 开始实现第一个需求
         *  1、请找出每个去处想去的人数是多少，并输出投票最多的去处是哪个
         */
        //15、使用stream流做
        Map.Entry<String, Integer> entry = infos.entrySet().stream().max((e1, e2) -> e1.getValue() - e2.getValue()).get();

//        infos.entrySet().stream().filter(e -> e.getValue()== entry.getValue()).forEach(e-> System.out.println(e));
//        infos.entrySet().stream().filter(e -> e.getValue().equals(entry.getValue())).forEach(System.out::println);///---------->这就是最优雅的代码
        List<String> names = infos.entrySet().stream().filter(
                e -> e.getValue().equals(entry.getValue())).map(
                        e -> e.getKey()).collect(Collectors.toList());///---------->这就是最优雅的代码
        System.out.println("选择人最多的去处是:");
        System.out.println(names);
        System.out.println("---------------------------------------");
        //16、实现第二个需求: 找出哪些人没有选择投票最多的去处, 输出他们的名字
        System.out.println("没有选择人数最多的去处是:");
        students.stream().filter(student -> {
            for (String s : student.getScenicSpot()) {
                if (names.contains(s)){
                    return false;
                }
            }
            return true;
        }).forEach(s -> System.out.println(s.getName()));

    }
}
